
/**
 * @file CCdiant.h
 * @brief Fichier d'entête du module CC.
 *
 * @author Mohammad NOROUZZADEH, Lotfi, Saleh
 */
#ifndef _CONTROLE_H
#define _CONTROLE_H


/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de CC                                */
/*                                                                       */
/* ********************************************************************* */

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

#include    "UE.h"

#include    "Etudiant.h"
#include "UtilStr.h"
#include "Chemin.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Définitions de types                           */
/*                                                                       */
/* ********************************************************************* */

/**
 * @struct CC
 * @brief Structure utilisée pour la gestion d'une CC.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */

struct sCC
{
	int codeCC;
	int codeUe;
	char * intitule;
	float coef;
};

/**
 * @typedef CC
 * @brief Redéfinit la structure sCC
 */
typedef struct sCC CC;


struct  sTabCC
{
  CC**tabCC;
  int nbCC;
};

typedef struct  sTabCC    TabCC;

struct  sNote
{
    int numCC;
    int numEtu;
    float   note;
};
typedef struct  sNote   Note;

struct  sTabNote
{
    Note    **  tabNote;
    int nbNote;
};
typedef struct  sTabNote    TabNote;


/**
 * @fn void initCC(CC * CC,const int codeCC,const char * intitule,const float *coef);
 * @brief Initialise un CC.
   initCC initialise codeCC, intitule et coef (après vérification) de la structure CC

 * @param[in, out] cc Pointeur vers l'cc à initialiser.
 * @param[in] codeCC Code de l'CC.
 * @param[in] intitule intitule de l'CC.
 * @param[in] coef coef de l'CC.
 * @rccrn 0 si tout est OK
 */
void initCC(CC * cc, const int codeCC,const int codeUe,const char * intitule,const float coef);

/**
 * @fn CC * creCC(const int codeCC,const char * intitule,const float *coef);
 * @brief Crée un CC en mémoire.

 * @param[in] codeCC Code de l'CC.
 * @param[in] intitule Hauteur de l'CC.
 * @param[in] coef coef de l'CC.
 * @rccrn un pointeur vers un CC
 */
CC *creCC(const int codeCC,const int codeUe, const char *intitule, const float coef);

/**
 * @fn void libCC(CC * cc);
 * @brief Libere un CC en mémoire.

 * @param[in, out] cc Pointeur vers l'cc.
 * @rccrn 0 si tout est OK
 */
void libCC(CC *cc);

/**
 * @fn detruireCC(CC ** cc);
 * @brief Détruit un CC en mémoire.

 * @param[in, out] cc Pointeur vers l'cc.
 * @rccrn 0 si tout est OK
 */
void detCC(CC ** cc);

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure CC                */
/*																		*/
/* ******************************************************************** */

/**
 * @fn int getcodeCC(const CC * cc);
 * @brief rccrner codeCC.

 * @param[in] cc pointeur vers l'cc.
 * @rccrn codeCC
 */
int getCodeCC(const CC *cc);

/**
 * @fn void setcodeCC(CC * cc, int codeCC);
 * @brief modifie le champ codeCC de l'cc.

 * @param[in, out] cc Pointeur vers l'cc.
 * @param[in] codeCC Code de l'CC.
 * @rccrn 0 si tout est OK
 */
void setCodeCC(CC *cc,const int codeCC);

/**
 * @fn char * getIntituleDeCC(const CC * cc);
 * @brief rccrner intitule.

 * @param[in] cc pointeur vers l'cc.
 * @rccrn intitule.
 */

char * getIntituleDeCC(const CC *cc);

/**
 * @fn void setIntituleDeCC(CC * cc ,const char * intitule);
 * @brief modifie le champ intitule de l'cc.

 * @param[in, out] cc Pointeur vers l'cc.
 * @param[in] intitule intitule de l'CC.
 * @rccrn 0 si tout est OK.
 */
void setIntituleDeCC(CC * cc,const char *intitule);

/**
 * @fn char * getCoef(const CC * cc);
 * @brief rccrner intitule.

 * @param[in] cc pointeur vers l'cc.
 * @rccrn intitule.
 */
float getCoef(const CC * cc);

/**
 * @fn void setCoef(CC * cc, const float *coef);
 * @brief modifie le champ intitule de l'cc.

 * @param[in, out] cc Pointeur vers l'cc.
 * @param[in] intitule intitule de l'CC.
 * @rccrn 0 si tout est OK.
 */
void setCoef(CC *cc,const float coef);

/**
 * @fn void affCC(const CC * cc);
 * @brief Afficher l'cc.

 * @param[in] cc pointeur vers l'cc.
 * @rccrn 0 si tout est OK
 */
void affCC(const CC *cc);

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'CC                       */
/*                                                                       */
/* ********************************************************************* */

/**
 * @fn void savCCParElem(const int codeCC,const char * intitule,const float *coef);
 * @brief saover CC dans un fichier binaire.
 *
 * @param[in] codeCC .
 * @param[in] intitule .
 * @param[in] coef .

 * @rccrn 0 si tout est OK.
 */
void savCCParElem(const int codeCC,const    int codeUe,const char * intitule,const float coef);


/**
 * @fn void savCCParElem(const int codeCC,const char * intitule,const float *coef);
 * @brief saover CC dans un fichier binaire.
 *
 * @param[in] codeCC .
 * @param[in] intitule .
 * @param[in] coef .

 * @rccrn 0 si tout est OK.
 */
void savCC(CC*cc);



/**
 * @fn int rchCCParCode(const int codeCC);
 * @brief recherche CC dans un fichier binaire.
 *
 * @param[in] codeCC .

 * @rccrn 0 s'il n'existe pas.
 * @rccrn 1 s'il existe.
 */
int rchCCParCode(const int codeCC);

/**
 * @fn CC *recCCParCode(const int codeCC);
 * @brief recupérer CC dans un fichier binaire.
 *
 * @param[in] codeCC .

 * @rccrn CC s'il n'existe pas.
 * @rccrn NULL s'il existe.
*/
CC *recCCParCode(const int codeCC);

TabCC   *   recCCParUe(UE*ue);

TabCC*  recCCParCodeUe(int  codeUe);

TabNote *   recNoteParCC(CC*cc);
Note *   recNoteParEtuCC(Etu*etu,CC*cc);
TabNote *   recNoteParEtuUe(Etu*etu,UE*ue);


void    saveNote(Note*note);

void    saveNoteParCode(int numCC,int   numEtu,float    note);

void    mdfNote(Note    *note,Note*noteNew);
void    supNote(Note*note);
void    supNoteParNum(int   numCC,int   numEtu);

/**
 * @fn int supCCParCode(const int codeCC);
 * @brief supprimer CC dans un fichier binaire.
 *
 * @param[in] codeCC .

 * @rccrn -1 s'il n'existe pas.
 * @rccrn 0 s'il supprime.
 */
int supCCParCode(const int codeCC);

int supCC(CC*cc);

int modifCC(CC*cc,CC*ccnew);

/**
 * @fn mdfCCParCode(const int codeCC, const CC *nCC);
 * @brief modifier CC dans un fichier binaire.
 *
 * @param[in] codeCC .
 * @param[in] CC .

 * @rccrn -1 s'il n'existe pas.
 * @rccrn 1 s'il modifie.
 * @rccrn 0 si non.
 */
int mdfCCParCode(const int codeCC, CC *pCC);

/**
 * @fn affCC_DB();
 * @brief Afficher base de donnee de CC .


 * @rccrn 0 si tout est OK.
 */
void affCC_DB();

/**
 * @fn void regCC() ;
 * @brief Test le module CC
 */
void regCC();

#endif
